
#include "FactoryJuego.h"

FactoryJuego::FactoryJuego(void)
{
}

Escenario* FactoryJuego::GenerarJuego(NodoXML* nodoEscenario)
{
	Escenario* escenario = new Escenario(nodoEscenario->getAttribute("id"));

	//pongo un NULL en el bonusActual.
	escenario->setBonusEnPantalla(NULL);

	vector<NodoXML>::iterator it;
	vector<NodoXML> listaDefEscenario = nodoEscenario->getChildrenList();

	bool texturasOK = false;
	bool elementosOK = false;
	bool generalOK = false;
	
	for(it=listaDefEscenario.begin(); it<listaDefEscenario.end(); it++)
	{
		if ( Utilidades::sonStringsIguales(it->getRoot(),"ListadoDeTexturas"))
		{
			vector<Textura*> vTexturas = TexturaFactory::GetTexturaInstance(it->getChildrenList());
			vector<Textura*>::iterator itTexturas;
			for(itTexturas = vTexturas.begin(); itTexturas < vTexturas.end(); itTexturas++)
			{
				if( BuscarId(escenario, (*itTexturas)->GetIdTextura().tostring((*itTexturas)->GetIdTextura().size())))
				{
					Log4Cpp::error("Id duplicado de una Textura con otro Id ya cargado, no se pudo cargar.\n","FactoryEscenario");
					itTexturas = vTexturas.erase(itTexturas);// Si ya esta en escenario no lo agrego
		 		};
				
			}
			TexturaFactory factoryTextura;
			escenario->SetVectorTextura(vTexturas);
			texturasOK=true;
		}
		else if (Utilidades::sonStringsIguales(it->getRoot(),"General"))
		{
			if ( !FactoryJuego::BuscarId( escenario, it->getAttribute("id")))
			{
				General *gen = new General();
				gen->SetId(it->getAttribute("id"));
				gen->SetResolucion(atoi(it->getAttribute("resolucion").c_str()));
				gen->SetColorFondoElem(it->getAttribute("colorFondoEle").c_str());
				gen->SetIdTextEle(it->getAttribute("texturaEle").c_str());
				gen->SetColorLinea(it->getAttribute("colorLinea").c_str());
				gen->SetColorFondoEsc(it->getAttribute("colorFondoEsc").c_str());
				gen->SetIdTextEsc(it->getAttribute("texturaEsc").c_str());
				escenario->SetGeneral(gen);
				generalOK=true;
			}else
				Log4Cpp::info("Id repetido de General con otro Id ya cargado, no se pudo cargar.\n","FactoryEscenario");

		}else if (Utilidades::sonStringsIguales(it->getRoot(),"listadoDeNiveles")){

			vector<NodoXML> vectorNivelesXML = it->getChildrenList();
			vector<NodoXML>::iterator itNiveles;
			for(itNiveles = vectorNivelesXML.begin(); itNiveles < vectorNivelesXML.end(); itNiveles++)
			{
				string path=(*itNiveles).getAttribute("path");
				escenario->addNivel(path);
			}

		}else if (Utilidades::sonStringsIguales(it->getRoot(),"listadoDeBonus")){

			vector<NodoXML> vectorBonusXML = it->getChildrenList();
			vector<NodoXML>::iterator itBonus;
			for(itBonus = vectorBonusXML.begin(); itBonus < vectorBonusXML.end(); itBonus++)
			{
 				string tipoBonus=(*itBonus).getRoot();
				string idTextura=(*itBonus).getAttribute("idTextura");
				string radio=(*itBonus).getAttribute("radio");

				Textura* textura=escenario->GetTextura(idTextura);
	
				Bonus* bonus=new Bonus(textura);
				bonus->setPosX(0);
				bonus->setPosY(0);
				bonus->setTipoBonus(tipoBonus);
				bonus->setRadio(atof(radio.c_str()));

				if (tipoBonus == "vida"){
					escenario->setBonusVida(bonus);
				}else if (tipoBonus == "puntos"){
					escenario->setBonusPuntos(bonus);
				}else if (tipoBonus == "retroceso"){
					escenario->setBonusRetroceso(bonus);
				}else if (tipoBonus == "precision"){
					escenario->setBonusPrecision(bonus);
				}else if (tipoBonus == "freno"){
					escenario->setBonusFreno(bonus);
				}else Log4Cpp::info("tipo de bonus no reconocido. \n","FactoryEscenario");
			}
		}else if (Utilidades::sonStringsIguales(it->getRoot(),"cantidadVidas")){
				vector<NodoXML> cantidadVidasXML = it->getChildrenList();
				escenario->setVidas(atoi(((*it).getAttribute("valor")).c_str()));
		}else Log4Cpp::info("Un hijo del escenario no es reconocido debido a un tag mal cerrado.\n","FactoryEscenario");
	}

	if (!generalOK){
		Log4Cpp::info("Elementos generales no encontrados en XML, se utilizan valores por defecto.\n","FactoryEscenario");
		General *gen = new General();
		escenario->SetGeneral(gen);
	}
	if (!texturasOK){
		Log4Cpp::error("Atencion, lista de texturas no encontrada en XML.\n","FactoryEscenario");

	}

	return escenario;
}

bool FactoryJuego::BuscarId(Escenario *escenario, string Id)
{
	bool encontrado = false;
	if (escenario->GetId() == Id)
		encontrado = true;
	else
	{	General *gen = escenario->GetGeneral();
		if (gen != NULL)
		{
			if (gen->GetId() == Id)
			{
				//Id encontrado imprimir atributos de general
				encontrado = true;
			}//Ahora lo busco en la lista de texturas
			else
			{
				vector<Textura*> vText;
				vText = escenario->GetListaTexturas();
				vector<Textura*>::iterator itText;
				for(itText = vText.begin(); itText<vText.end(); itText++)
				{
					if( (*itText)->GetIdTextura() == Id)
					{
						encontrado = true;
						break;
					}
				}
			if( encontrado == false )
			{
				vector<Elemento*> vElem = (*escenario).getListaElementos();
				vector<Elemento*>::iterator itElem;
				for (itElem=vElem.begin(); itElem<vElem.end(); ++itElem)
				{
					if ( (*itElem)->getid() == Id)
					{
					encontrado = true;
					break;
					}
				}
			}
			
			
		}
	}
	}
return encontrado;
}	